<?php

include_once('Conexao.php');

/**
 * Superclasse de um DAO.
 *
 */
class DAO
{

	/**
	 * Obtém a instância única da conexão
	 * com o banco de dados.
	 *
	 * @return PDO A instância única da conexão com o banco de dados.
	 */
	protected function getConexao()
	{
		return Conexao::get_instance();
	}


	/**
	 * Transforma uma mensagem caso a variavel de debug esteja ativada (TRUE)
	 * para uma mensagem com o mensagem personalizada mais a mensagem de excecao normal.
	 * Caso a variavel de debug esteja desativa (FALSE) apenas a mensagem de excecao trata e exibida.
	 *
	 * @param Exception $e
	 * @param $mensagem
	 */
	protected function gerarExcecao( Exception $e, $mensagem )
	{
		if (Conexao::debug) {
			$msg = "{$mensagem}<br>{$e->getMessage()}";
		} else {
			$msg = $mensagem;
		}
		throw new ExceptionDAO($msg);
	}

	/**
	 * Remove caracteres curinga do SQL que são usados no like: '%' e '_'
	 * @param string $param
	 * @param int $minSize O tamanho m�nimo que o parâmetro deve ter após a limpeza.
	 * @return string
	 * @throws ExceptionDAO Se ap�s a limpeza o par�metro desaparecer.
	 */
	protected static function cleanLikeParam( $param, $minSize )
	{
		$param = str_replace("%", "", $param);
		$param = str_replace("_", "", $param);

		if( strlen($param) < $minSize ) {
			throw new ExceptionDAO("Par&acirc;metro inv&aacute;lido.");
		}
		return $param;
	}

	/**
	 * Obtém um mapa de códigos de erro SQL para mensagens de erro amigáveis ao usuário.
	 *
	 * @return array de array.
	 */
	private static function _getMapaCodigoMensagemErro()
	{
		// Array com mapeamento de codigo sql para uma frase mais amigavel para o usuario.
		return	array( array( '1451', 'Este registro n&atilde;o pode ser modificado/removido pois est&aacute; vinculado a outros registros.'),
					   array( '1062', 'J&aacute; existe um registro cadastrado com este par&acirc;metro.') );
	}

	/**
	 * Mapeia uma exceção de banco de dados em uma outra exceção com uma mensagem mais adapatada ao usuário.
	 *
	 * @param $e A exceção de BD original
	 * @param $situacao O texto com a situção em que o erro ocorreu.
	 * @return ExceptionDAO Uma nova exceção com uma mensagem de erro melhor para o usuário.
	 */
	protected static function mapeiaExcecao( PDOException $e, $situacao )
	{
		$novaMensagem = "Erro no banco de dados ao {$situacao}.";
		foreach ( self::_getMapaCodigoMensagemErro() as $codigo_mensagem) {
			if ( strpos( $e->getMessage(), $codigo_mensagem[0] ) !== FALSE ) {
				$novaMensagem = $codigo_mensagem[1];
			}
		}

		return new ExceptionDAO($novaMensagem);
	}

}